/* Fehler bei der Verkleinerung. Der Inhalt wird unverkleinert zurückgegeben.
(1790,5,1798,6): run-time error JS1314: Implicit property name must be identifier: isCategoryConfirmed(category) {
        if (typeof category === 'string') {
            return eShop.cookies.getConfirmedCookieCategoryNames().indexOf(category) > -1;
        }
        if (typeof category === 'number') {
            return eShop.cookies.getConfirmedCookieCategoryValues().indexOf(category) > -1;
        }
        throw new Error();
    }
 */
// Polyfills
if (!Number.isNan) {
    Object.defineProperty(Number, 'isNaN', {
        value: function (value) {
            return value !== value;
        }
    });
}

if (!String.prototype.repeat) {
    String.prototype.repeat = function (count) {
        'use strict';
        if (this == null)
            throw new TypeError('can\'t convert ' + this + ' to object');

        var str = '' + this;
        // To convert string to integer.
        count = +count;
        // Check NaN
        if (count != count)
            count = 0;

        if (count < 0)
            throw new RangeError('repeat count must be non-negative');

        if (count == Infinity)
            throw new RangeError('repeat count must be less than infinity');

        count = Math.floor(count);
        if (str.length == 0 || count == 0)
            return '';

        // Ensuring count is a 31-bit integer allows us to heavily optimize the
        // main part. But anyway, most current (August 2014) browsers can't handle
        // strings 1 << 28 chars or longer, so:
        if (str.length * count >= 1 << 28)
            throw new RangeError('repeat count must not overflow maximum string size');

        var maxCount = str.length * count;
        count = Math.floor(Math.log(count) / Math.log(2));
        while (count) {
            str += str;
            count--;
        }
        str += str.substring(0, maxCount - str.length);
        return str;
    }
};
/***************************** 
 * © by blue office® E-Shop 
 * Developed by CompuTech Informatik AG 
 */

var eShop = eShop || {};

eShop.asyncTmplCallbacks = {
    geladen: [],
    delegates: []
};

eShop.asyncTmplGeladen = function (tmplName) {
    this.asyncTmplCallbacks.geladen.push(tmplName);
    for (var i = 0; i < this.asyncTmplCallbacks.delegates.length; i++) {
        if (this.asyncTmplCallbacks.delegates[i].name === tmplName) {
            this.asyncTmplCallbacks.delegates[i].cb();
        }
    }
};

eShop.asyncTmplDelegate = function (tmplName, fn) {
    if (this.asyncTmplCallbacks.geladen.indexOf(tmplName) > -1) {
        fn();
    }
    else {
        this.asyncTmplCallbacks.delegates.push({ name: tmplName, cb: fn });
    }
};

//Element im Viewport sichtbar
eShop.isElementVisible = function (el, includeAboveFold) {
    var eap,
        rect = el.getBoundingClientRect(),
        docEl = document.documentElement,
        vWidth = window.innerWidth || docEl.clientWidth,
        vHeight = window.innerHeight || docEl.clientHeight,
        efp = function (x, y) { return document.elementFromPoint(x, y); },
        contains = "contains" in el ? "contains" : "compareDocumentPosition",
        has = contains === "contains" ? 1 : 0x14;

    // Return false if it's not in the viewport
    if (rect.right < 0 || rect.bottom < 0
        || rect.left > vWidth || rect.top > vHeight)
        return false;

    if (includeAboveFold)
        return true;

    // Return true if any of its four corners or its middle are visible
    return (
        (eap = efp(Math.ceil(rect.left), Math.ceil(rect.top))) == el || el[contains](eap) == has
        || (eap = efp(Math.floor(rect.right), Math.ceil(rect.top))) == el || el[contains](eap) == has
        || (eap = efp(Math.floor(rect.right), Math.floor(rect.bottom))) == el || el[contains](eap) == has
        || (eap = efp(Math.ceil(rect.left), Math.floor(rect.bottom))) == el || el[contains](eap) == has
        || (eap = efp(Math.floor(rect.left + (rect.right - rect.left) / 2), Math.floor(rect.top + (rect.bottom - rect.top) / 2))) == el || el[contains](eap) == has
    );
};

//Pixel Ratio of device
eShop.getDevicePixelRatio = function () {
    var ratio = 1;
    // To account for zoom, change to use deviceXDPI instead of systemXDPI
    if (window.screen.systemXDPI !== undefined && window.screen.logicalXDPI !== undefined && window.screen.systemXDPI > window.screen.logicalXDPI) {
        // Only allow for values > 1
        ratio = window.screen.systemXDPI / window.screen.logicalXDPI;
    }
    else if (window.devicePixelRatio !== undefined) {
        ratio = window.devicePixelRatio;
    }
    return ratio;
};

//Dynamische Inhalte
eShop.asyncArtikelTexte = {

    elemListe: [],
    felderListe: [],
    timeout: null,

    scannen: function (delay) {
        $('[data-async][data-identif]').not('.loading').each(function (i, elem) {
            var $elem = $(elem);

            if (!$elem.is('.force-load') && !eShop.isElementVisible(elem)) return;

            var identif = $elem.addClass('loading').attr('data-identif');
            var feld = $elem.attr('data-async').replace('artikeltexte.', '');
            if (eShop.asyncArtikelTexte.elemListe.indexOf(identif) == -1) {
                eShop.asyncArtikelTexte.elemListe.push(identif);
            }
            if (eShop.asyncArtikelTexte.felderListe.indexOf(feld) == -1) {
                eShop.asyncArtikelTexte.felderListe.push(feld);
            }
        });

        if (!eShop.asyncArtikelTexte.timeout) eShop.asyncArtikelTexte.timeout = window.setTimeout(eShop.asyncArtikelTexte.laden, delay);
    },

    laden: function () {
        var tempElem = eShop.asyncArtikelTexte.elemListe;
        var tempFelder = eShop.asyncArtikelTexte.felderListe;
        eShop.asyncArtikelTexte.elemListe = [];
        eShop.asyncArtikelTexte.felderListe = [];
        eShop.asyncArtikelTexte.timeout = null;

        if (tempElem.length > 0) {
            $.get("/api/artikeltexte",
                { elem: tempElem.join(','), felder: tempFelder.join(',') },
                function (data) {
                    $(data).find('ArtikelText').each(function (index, elem) {
                        var $text = $(elem);
                        $('[data-async="artikeltexte.' + $text.children('feld').text() + '"][data-identif="' + $text.children('identif').text() + '"]').each(function (i, el) {
                            $(el).removeClass('loading').removeAttr('data-async').html($text.children('inhalt').text());
                        });
                    });
                }, 'xml');
        }

    }
};

eShop.getCategoryDownloads = function (id) {

        $.get("/api/categorydownloads/" + id,
            function (data) {
                $(data).find('CategoryDownload').each(function (index, elem) {
                    var title = $(this).find('Title').text(),
                        extension = $(this).find('Extension').text(),
                        size = $(this).find('SizeText').text(),
                        url = $(this).find('Url').text(),
                        language = $(this).find('Language').text();
                    var shopUrl = window.location.origin;
                    $(".wg-downloads .optionen ul").append('<li class="option"><a href="' + shopUrl + '/' + url + title + extension + '" target="_blank">' + title + extension + ' (' + size + ')' + '</a></li>');
                    $('.wg-downloads').css({ 'display': 'block' });
                });
            }, 'xml');
};

eShop.loadImagesInPxRatio = function () {
    //Bilder von Artikeln und WGs mit der passenden Pixel-Ratio laden
    $('img[data-src]').css('opacity', 0);

    var pxRatio = eShop.getDevicePixelRatio();
    var fn = function (isScrollEvent) {
        $('img[data-src]').each(function (i, img) {
            var $img = $(img);
            if (!$img.is('.force-load') && !eShop.isElementVisible(img, !isScrollEvent)) return;

            var src = $img.attr('data-src');
            if (pxRatio != 1 && /\/(de|fr|it|en)\/media\/[^\/]+(\?.*)?$/i.test(src)) {
                src = src.replace(/\.\w+(\?.*)?$/i, '.' + (Math.round(pxRatio * 10000) / 10000) + '$&');
            }
            var newImg = new Image();
            newImg.onload = function () {
                $img.attr('src', src).removeAttr('data-src').animate({ opacity: 1 }, 700);
            };
            newImg.src = src;
        });
    };
    window.setTimeout(fn, 1);
    $(window).scroll(function () { fn(true); });

    //Verweise auf Bilder mit der passenden Pixel-Ratio anpassen
    if (pxRatio != 1)
        window.setTimeout(function () {
            $('a.pixelratio').each(function () {
                var src = $(this).attr('href');
                if (/\/(de|fr|it|en)\/media\/[^\/]+(\?.*)?$/i.test(src)) {
                    $(this).attr('href', src.replace(/\.\w+(\?.*)?$/i, '.' + Math.round(pxRatio * 10000) / 10000 + '$&'));
                }
            });
        }, 100);
};

$(window)
    .load(function () {
        eShop.asyncArtikelTexte.scannen(0);
        $('[data-async]').parents().each(function (i, elem) {
            if ($(elem).css('overflow') === 'auto' || $(elem).css('overflow') === 'scroll')
                $(elem).scroll(function () { eShop.asyncArtikelTexte.scannen(500); });
        });
    })
    .scroll(function () { eShop.asyncArtikelTexte.scannen(500); });


function GetInputNumber($elem, defaultNumber) {
    // Prüft das jQuery-Objekt $elem, ob es elemente hat und eine Zahl als Wert hat und gibt diese anschliessend zurück.
    // Wenn keine Zahl gefunden wird, wird die mitgelieferte Detault-Zahl zurückgegeben.
    if ($elem.length > 0) {
        var number = $elem.first().val().replace(',', '.') * 1;
        if (isNaN(number)) number = defaultNumber;
        return number;
    }
    else 
        return defaultNumber;
}

eShop.inDenWarenkorbButtonInit = function (context) {

    //In-den-Warenkorb-Button
    $('.in-den-warenkorb', context ? context : document).not('[data-idw-ready]')
        .attr('data-idw-ready', '1')
        .keypress(function (e) {
            if (e.which === 13) {
                e.preventDefault();
                $(this).find('.in-den-warenkorb-button').click();
            }
        })
        .find('.in-den-warenkorb-button').click(function (e) {
            e.preventDefault();
            if (typeof eShop.inDenWarenkorbKontrolle === 'function' && !eShop.inDenWarenkorbKontrolle($(this))) return;

            var $container = $(this).closest('.in-den-warenkorb');

            if ($container.attr('data-isbundle') !== undefined) {
                // Bundle
                $.post('/api/s/cartadd/bundlequantity', {
                    quantity: {
                        BundleType: $container.attr('data-bundle-type'),
                        BundleRef: $container.attr('data-bundle-ref'),
                        Quantity: GetInputNumber($container.find('input.anzahl, input[data-quantity]'))
                    }
                }, function (data) {
                    if (eShop.BundleCartAddFeedback)
                        eShop.BundleCartAddFeedback(data);
                    else
                        eShop.Form.Submit($container, null);
                });
            }
            else {
                // Artikel
                var identif = $container.attr('data-identif');
                var custServicesIdentifiers;
                if (eShop.GetCustomerServiceForCartProduct !== undefined)
                    custServicesIdentifiers = eShop.GetCustomerServiceForCartProduct($container);

                if (identif) {
                    $.post("/api/s/cartadd/additemfallback", {
                        identif: identif,
                        anz: GetInputNumber($container.find('input.anzahl, input[data-quantity]'), 1),
                        l: GetInputNumber($container.find('input.laenge, input[data-length]'), 0),
                        b: GetInputNumber($container.find('input.breite, input[data-width]'), 0),
                        h: GetInputNumber($container.find('input.hoehe, input[data-height]'), 0),
                        add: $container.attr('data-addieren'),
                        text0: $container.attr('data-text0'),
                        text1: $container.attr('data-text1'),
                        text2: $container.attr('data-text2'),
                        text3: $container.attr('data-text3'),
                        text4: $container.attr('data-text4'),
                        comparisonHash: $container.attr('data-comparison'),
                        bundleType: $container.attr('data-bundle-type') === undefined ? 0 : $container.attr('data-bundle-type'),
                        bundleRef: $container.attr('data-bundle-ref') === undefined ? 0 : $container.attr('data-bundle-ref'),
                        bundleTitle: $container.attr('data-bundle-title') === undefined ? '' : $container.attr('data-bundle-title'),
                        customerServicesIdentifier: $container.attr('data-customerservices'),
                        customerServiceSelectionsIdentifiers: custServicesIdentifiers
                    }, eShop.inDenWarenkorbFeedback);
                }
            }
        });

};

eShop.inDenWarenkorbKollektiv = function (idwCtrls) {

    // Kollektives hinzufügen von mehreren Artikeln in den Warenkorb
    if (idwCtrls === null) return;

    var xml = $('<indenwarenkorb />');
    $.each(idwCtrls, function (i, item) {
        var $item = $(item);
        if ($item.is('.in-den-warenkorb') && $item.attr('data-identif')) {
            var xArtikel = $('<artikel />').appendTo(xml);
            $('<identif />').text($item.attr('data-identif')).appendTo(xArtikel);
            $('<anz />').text(GetInputNumber($item.find('input.anzahl, input[data-quantity]'), 1)).appendTo(xArtikel);
            $('<l />').text(GetInputNumber($item.find('input.laenge, input[data-length]'), 0)).appendTo(xArtikel);
            $('<b />').text(GetInputNumber($item.find('input.breite, input[data-width]'), 0)).appendTo(xArtikel);
            $('<h />').text(GetInputNumber($item.find('input.hoehe, input[data-height]'), 0)).appendTo(xArtikel);
            $('<text0 />').text($item.attr('data-text0')).appendTo(xArtikel);
            $('<text1 />').text($item.attr('data-text1')).appendTo(xArtikel);
            $('<text2 />').text($item.attr('data-text2')).appendTo(xArtikel);
            $('<text3 />').text($item.attr('data-text3')).appendTo(xArtikel);
            $('<text4 />').text($item.attr('data-text4')).appendTo(xArtikel);
            $('<add />').text($item.attr('data-addieren')).appendTo(xArtikel);
            $('<bundleType />').text($item.attr('data-bundle-type') === undefined ? 0 : $item.attr('data-bundle-type')).appendTo(xArtikel);
            $('<bundleRef />').text($item.attr('data-bundle-ref') === undefined ? 0 : $item.attr('data-bundle-ref')).appendTo(xArtikel);
            $('<bundleTitle />').text($item.attr('data-bundle-title') === undefined ? '' : $item.attr('data-bundle-title')).appendTo(xArtikel);
        }
    });

    if (xml.children().length > 0) {
        $.ajax({
            type: "POST",
            url: "/api/s/cartadd/fallback",
            data: '=' + encodeURIComponent(xml.wrap('<xml />').parent().html()),
            success: eShop.inDenWarenkorbFeedback,
            dataType: 'xml'
        });
    }
};

eShop.ProductsToCartCollective = function (products) {

    // Kollektives hinzufügen von mehreren Artikeln in den Warenkorb
    if (products === null || products.length === 0) return;

    var xml = $('<indenwarenkorb />');
    $.each(products, function (i, item) {
        var xArtikel = $('<artikel />').appendTo(xml);
        $('<identif />').text(item.Identifier).appendTo(xArtikel);
        $('<anz />').text(item.Quantity === undefined ? 1 : item.Quantity).appendTo(xArtikel);
        $('<l />').text(item.Length === undefined ? 0 : item.Length).appendTo(xArtikel);
        $('<b />').text(item.Width === undefined ? 0 : item.Width).appendTo(xArtikel);
        $('<h />').text(item.Height === undefined ? 0 : item.Height).appendTo(xArtikel);
        $('<text0 />').text(item.Text0 === undefined ? '' : item.Text0).appendTo(xArtikel);
        $('<text1 />').text(item.Text1 === undefined ? '' : item.Text1).appendTo(xArtikel);
        $('<text2 />').text(item.Text2 === undefined ? '' : item.Text2).appendTo(xArtikel);
        $('<text3 />').text(item.Text3 === undefined ? '' : item.Text3).appendTo(xArtikel);
        $('<text4 />').text(item.Text4 === undefined ? '' : item.Text4).appendTo(xArtikel);
        $('<add />').text(item.Add === undefined ? true : item.Add).appendTo(xArtikel);
        $('<bundleType />').text(item.BundleType === undefined ? 0 : item.BundleType).appendTo(xArtikel);
        $('<bundleRef />').text(item.BundleRef === undefined ? 0 : item.BundleRef).appendTo(xArtikel);
        $('<bundleTitle />').text(item.BundleTitle === undefined ? '' : item.BundleTitle).appendTo(xArtikel);
    });

    if (xml.children().length > 0) {
        $.ajax({
            type: "POST",
            url: "/api/s/cartadd/fallback",
            data: '=' + encodeURIComponent(xml.wrap('<xml />').parent().html()),
            success: eShop.inDenWarenkorbFeedback,
            dataType: 'xml'
        });
    }
};

eShop.messageIfAvailableSubscription = function(artId, ausf, lang, mail, name, callback) {
    $.ajax({
        method: "POST",
        url: "/api/graphql",
        contentType: "application/json",
        data: JSON.stringify({
            query: `mutation CreateSubscription($subscription: MessageIfAvailableSubscriptionInputType!, $name: String!) {
                      MessageIfAvailableSubscription(name: $name, subscription: $subscription)
                    }`,
            variables: {
                "subscription": {
                    "productId": artId,
                    "productModel": ausf,
                    "mail": mail,
                    "lang": lang
                },
                "name": name
            }
        }),
        success: callback
    })
}

// Dienstleistungen im Warenkorb setzen
eShop.SetCustomerService = function (selection) {
    this.SetCustomerServiceWithCallback(selection, function () {
        // Seite neu laden
        location.assign(location.href);
    });
};

eShop.SetCustomerServiceWithCallback = function (selection, callback) {
    $.ajax({
        type: 'POST',
        url: '/api/s/cartadd/setcustomerservice',
        data: {
            appliedTo: selection.appliedTo,
            serviceId: selection.serviceId,
            optionProductStorageId: selection.optionProductStorageId,
            remove: selection.remove ? selection.remove : false,
            productIndex: selection.productIndex !== undefined ? selection.productIndex : -1,
            bundleIndex: selection.bundleIndex !== undefined ? selection.bundleIndex : -1
        },
        success: callback
    });
};

eShop.SetMultipleCustomerServices = function (selections) {
    for (var i = 0; i < selections.length; i++) {
        this.SetCustomerServiceWithCallback(selections[i], $.noop);
    }
};

//Merkliste
eShop.merklisten = {
    setzen: function (artId, ausf, listeId, wert, sender, toggleCallback) {
        $.get('/api/s/wishlist/' + artId + '/' + ausf + '/' + listeId + '/' + (wert ? 1 : 0), function (data) {
            if (toggleCallback) {
                toggleCallback(true, $(data).find('Merkliste AnzahlArtikel').text() * 1, sender);
            }
        }, 'xml')
            .error(function () {
                if (toggleCallback) toggleCallback(false, null, sender);
            });
    }
};

//Artikellisten-Filter
eShop.filter = {

    instanzen: [],

    neueInstanz: function (elem) {
        var $elem = $(elem);
        var baseUrl = $elem.attr('data-filter-baseurl');
        if (baseUrl === undefined || baseUrl === null || baseUrl.length === 0)
            baseUrl = location.href;

        var i = {
            container: $elem,
            template: $elem.find('[data-f-template="gruppe"]').first(),

            templateBinden: function (gItem) {
                var $g = $(gItem);
                var typ = $g.children('typ').text();
                var feld = $g.children('feld').text();

                //Neuer Klon, neue Gruppeninstanz
                var klon = this.template.clone().removeAttr('data-f-template').removeAttr('style')
                    .attr('data-f-feld', feld)
                    .attr('data-f-typ', typ)
                    .addClass('typ-' + typ);

                if ($g.children('aktiv').text() == 'true')
                    klon.addClass('aktiv');

                klon.find('[data-f-template="kategorie"]').first().removeAttr('data-f-template')
                    .text($g.children('kategorie').text())
                    .click(function (e) {
                        klon.toggleClass('offen')
                            .siblings().removeClass('offen');
                    });

                var wertContainerTmpl = klon.find('[data-f-template="wert-container"]').first().removeAttr('data-f-template');

                switch (typ) {
                    case 'VAL':
                        //Zur Auswahl stehende Werte
                        $g.find('optionen FilterWertOption').each(function (index, item) {
                            var $opt = $(item);
                            var cnt = $opt.children('count').text() * 1;

                            var container = wertContainerTmpl.clone()
                                .attr('data-f-wert', $opt.children('wert').text())
                                .attr('data-f-count', cnt)
                                .click(function (e) {
                                    var targetAktivWerte = [];
                                    if ($(this).filter('.aktiv').length > 0)
                                        targetAktivWerte = $(this).filter('.aktiv').attr('data-f-wert').split(',');
                                    var wertParam = [];
                                    container.siblings('[data-f-wert]').andSelf().each(function (indx, itm) {
                                        var $itm = $(itm);
                                        var fWerte = $itm.attr('data-f-wert').split(',');
                                        if ($itm.is('.aktiv')) {
                                            for (var j = 0; j < fWerte.length; j++) {
                                                if (targetAktivWerte.indexOf(fWerte[j]) > -1) return;
                                            }
                                        }
                                        if ($itm.is('.aktiv') != $itm.is(container))
                                            wertParam.push($itm.attr('data-f-wert'));
                                    });
                                    eShop.filter.anwenden(feld, typ, wertParam, eShop.filter.getConstructedUrl(baseUrl), $elem.data('noRedirect') === true);
                                });

                            if ($opt.children('aktiv').text() == 'true')
                                container.addClass('aktiv');

                            container.find('[data-f-template="wert"]').first().removeAttr('data-f-template')
                                .text($opt.children('text').text());

                            container.find('[data-f-template="count"]').first().removeAttr('data-f-template')
                                .text(cnt);

                            container.find('[data-f-template="count-container"]').first().removeAttr('data-f-template')
                                .addClass('cnt' + cnt);

                            container.insertBefore(wertContainerTmpl);
                        });
                        break;

                    case 'INDX':
                        //Zur Auswahl stehende Werte
                        $g.find('optionen FilterWertOption').each(function (index, item) {
                            var $opt = $(item);
                            var cnt = $opt.children('count').text() * 1;

                            var container = wertContainerTmpl.clone()
                                .attr('data-f-wert', $opt.children('wert').text())
                                .attr('data-f-count', cnt)
                                .click(function (e) {
                                    var wertParam = [];
                                    container.siblings('[data-f-wert]').andSelf().each(function (indx, itm) {
                                        var $itm = $(itm);
                                        if ($itm.is('.aktiv') != $itm.is(container))
                                            wertParam.push($itm.attr('data-f-wert'));
                                    });
                                    eShop.filter.anwenden(feld, typ, wertParam, eShop.filter.getConstructedUrl(baseUrl), $elem.data('noRedirect') === true);
                                });

                            if ($opt.children('aktiv').text() == 'true')
                                container.addClass('aktiv');

                            container.find('[data-f-template="wert"]').first().removeAttr('data-f-template')
                                .text($opt.children('text').text());

                            container.find('[data-f-template="count"]').first().removeAttr('data-f-template')
                                .text(cnt);

                            container.find('[data-f-template="count-container"]').first().removeAttr('data-f-template')
                                .addClass('cnt' + cnt);

                            container.insertBefore(wertContainerTmpl);
                        });
                        break;

                    case 'RANGE_NUM':
                    case 'RANGE_DAT':
                        //Wertebereich
                        var container = wertContainerTmpl.clone();

                        var resetBt = $('<div class="reset" />');

                        container.find('[data-f-template="wert"]').first()
                            .before(resetBt)
                            .before(
                                $('<div class="eingabe von" />')
                                    .append(
                                        $('<span class="beschriftung" />').text($g.children('textVon').text())
                                    )
                                    .append(
                                        $('<input type="text" />').attr('placeholder', $g.children('textVon').text())
                                    )
                            )
                            .before(
                                $('<div class="eingabe bis" />')
                                    .append(
                                        $('<span class="beschriftung" />').text($g.children('textBis').text())
                                    )
                                    .append(
                                        $('<input type="text" />').attr('placeholder', $g.children('textBis').text())
                                    )
                            )
                            .before(
                                $('<button class="anwenden" />').text(this.container.attr('data-filter-anwenden')).click(function (e) {
                                    e.preventDefault();
                                    var von = container.find('.eingabe.von input').val().replace(/[^\-\d,.]/g, '');
                                    var bis = container.find('.eingabe.bis input').val().replace(/[^\-\d,.]/g, '');

                                    if (typ == 'RANGE_NUM') {
                                        von = von.length == 0 || isNaN(von) ? '' : (von * 1 + '').replace(',', '.');
                                        bis = bis.length == 0 || isNaN(bis) ? '' : (bis * 1 + '').replace(',', '.');
                                    }

                                    if (von.length + bis.length > 0) {
                                        eShop.filter.anwenden(feld, typ, { von: von, bis: bis }, eShop.filter.getConstructedUrl(baseUrl), $elem.data('noRedirect') === true);
                                    }
                                    else
                                        eShop.filter.reset(feld, $elem.data('noRedirect') === true);
                                })
                            )
                            .remove();

                        container.find('[data-f-template="count-container"]').remove();
                        var filterData = {
                            min: $g.children('MinValue').text() * 1,
                            max: $g.children('MaxValue').text() * 1,
                            valFrom: 0,
                            valTo: 0
                        };
                        filterData.valFrom = filterData.min;
                        filterData.valTo = filterData.max;

                        if (klon.is('.aktiv')) {
                            var wVon = $g.children('wertVon').text();
                            var wBis = $g.children('wertBis').text();

                            if (typ == 'RANGE_DAT') {
                                if (wVon.length > 0) {
                                    var d = new Date(wVon);
                                    wVon = $.zeroPad(d.getDate(), 2) + '.' + $.zeroPad(d.getMonth() + 1, 2) + '.' + d.getFullYear();
                                }
                                if (wBis.length > 0) {
                                    var d = new Date(wBis);
                                    wBis = $.zeroPad(d.getDate(), 2) + '.' + $.zeroPad(d.getMonth() + 1, 2) + '.' + d.getFullYear();
                                }
                            }
                            else {
                                var valFrom = wVon.replace(/([,.]\d+$|\D)/g, '') * 1;
                                var valTo = wBis.replace(/([,.]\d+$|\D)/g, '') * 1;
                                if (!isNaN(valFrom)) filterData.valFrom = valFrom;
                                if (!isNaN(valTo)) filterData.valTo = valTo;
                            }

                            container.find('.eingabe.von input').val(wVon);
                            container.find('.eingabe.bis input').val(wBis);

                            if (wVon.length > 0) {
                                resetBt.append(
                                    $('<span class="bschr von" />').text($g.children('textVon').text())
                                )
                                    .append(
                                        $('<span class="wrt von" />').text(wVon)
                                    );
                            }
                            if (wBis.length > 0) {
                                resetBt.append(
                                    $('<span class="bschr bis" />').text($g.children('textBis').text())
                                )
                                    .append(
                                        $('<span class="wrt bis" />').text(wBis)
                                    );
                            }

                            resetBt.click(function (e) {
                                eShop.filter.reset(feld, $elem.data('noRedirect') === true);
                            });

                            container.find('.icon').click(function (e) {
                                resetBt.click();
                            });
                        }

                        container.data('filterData', filterData);

                        container.insertBefore(wertContainerTmpl);

                        container.find('.eingabe input').keydown(function (e) {
                            if (e.which == 13) {
                                e.preventDefault();
                                container.find('button.anwenden').click();
                            }
                        });
                        break;

                    case 'INPUT':
                        //Benutzereingabe
                        var container = wertContainerTmpl.clone();

                        var resetBt = $('<div class="reset" />');

                        container.find('[data-f-template="wert"]').first()
                            .before(resetBt)
                            .before(
                                '<div class="eingabe"><input type="text" /></div>'
                            )
                            .before(
                                $('<button class="anwenden" />').text(this.container.attr('data-filter-anwenden')).click(function (e) {
                                    e.preventDefault();
                                    var begriff = container.find('.eingabe input').val().replace(/^\s+|\s+$/g, '');
                                    if (begriff.length > 0) {
                                        eShop.filter.anwenden(feld, typ, begriff, eShop.filter.getConstructedUrl(baseUrl), $elem.data('noRedirect') === true);
                                    }
                                    else
                                        eShop.filter.reset(feld, $elem.data('noRedirect') === true);
                                })
                            )
                            .remove();

                        container.find('[data-f-template="count-container"]').remove();

                        if (klon.is('.aktiv')) {
                            var sWert = $g.children('wertVon').text();
                            container.find('.eingabe input').val(sWert);

                            resetBt.append(
                                $('<span class="wrt" />').text(sWert)
                            )
                                .click(function (e) {
                                    eShop.filter.reset(feld, $elem.data('noRedirect') === true);
                                });

                            container.find('.icon').click(function (e) {
                                resetBt.click();
                            });
                        }

                        container.insertBefore(wertContainerTmpl);

                        container.find('.eingabe input').keydown(function (e) {
                            if (e.which == 13) {
                                e.preventDefault();
                                container.find('button.anwenden').click();
                            }
                        });

                        break;

                    default:
                        klon = null;
                }

                wertContainerTmpl.remove();

                if (klon != null) klon.insertBefore(this.template);
            }
        };
        this.instanzen.push(i);
    },

    init: function () {
        //Filter Instanzen
        $('.artikellisten-filter[data-filter]').each(function (index, item) {
            eShop.filter.neueInstanz(item);
        });

        //Aktive Filter aus QueryString
        var aktiveSekFilter = '';
        var queryStringVars = window.location.search.substring(1).split("&");
        for (var i = 0; i < queryStringVars.length; i++) {
            var paar = queryStringVars[i].split("=");
            if (paar[0] == 'filter' && paar[1] != null && paar[1].length > 0) {
                aktiveSekFilter = paar[1];
            }
        }

        for (var i = 0; i < this.instanzen.length; i++) {
            var inst = this.instanzen[i];

            //Filter abrufen
            $.get('/api/s/filter', {
                prim: inst.container.attr('data-filter'),
                sek: aktiveSekFilter
            }, function (data) {
                var fGruppen = $(data).find('FilterGruppe');
                if (fGruppen.length === 0) {
                    inst.container.remove();
                    inst.container = null;
                    inst.template = null;
                }
                else {
                    fGruppen.each(function (index, item) {
                        //Daten Binden
                        inst.templateBinden(item);
                    });
                }
                if (eShop.filter.geladenCallback != null)
                    eShop.filter.geladenCallback(inst.container);
            }, 'xml');

        }
    },

    anwenden: function (feld, typ, wert, baseUrl, noRedirect) {
        //Parameter Wert
        var paramWert;
        switch (typ) {
            case 'VAL':
                //Werte-Liste
                paramWert = '';
                for (var i = 0; i < wert.length; i++) {
                    if (i > 0) paramWert += '-';
                    paramWert += eShop.filter.paramWertEncoding(wert[i]);
                }
                if (paramWert.length == 0) {
                    eShop.filter.reset(feld, noRedirect);
                    return;
                }
                break;

            case 'INDX':
                //Index-Liste hexadezimal
                var wertDec = 0;
                for (var i = 0; i < wert.length; i++) {
                    wertDec += Math.pow(2, wert[i] * 1);
                }
                if (wertDec == 0) {
                    eShop.filter.reset(feld, noRedirect);
                    return;
                }
                paramWert = wertDec.toString(16);
                break;

            case 'RANGE_NUM':
            case 'RANGE_DAT':
                //Wertebereich
                paramWert = eShop.filter.paramWertEncoding(wert.von) + '-' + eShop.filter.paramWertEncoding(wert.bis);
                break;

            case 'INPUT':
                //Benutzereingabe
                paramWert = eShop.filter.paramWertEncoding(wert);
                break;

            default:
                return;
        }

        //URL zusammenstellen
        var url = '';
        var urlParams = '';
        var paramIndex = baseUrl.indexOf('?');
        if (paramIndex == -1 || paramIndex == undefined) {
            //wenn kein Parameter angegeben > ganze URL mitgeben
            url = baseUrl;
        }
        else {
            url = baseUrl.substring(0, paramIndex);
            urlParams = baseUrl.substr(paramIndex);
        }
        var rx = new RegExp('([=_])' + feld + '(?:~|%7e)[^_]*', 'gi');
        if (rx.test(urlParams)) {
            //ersetzen
            url += urlParams.replace(rx, '$1' + feld + '~' + paramWert);
        }
        else {
            //anfügen
            var paramFeldWert = feld + '~' + paramWert;
            var locSearch = urlParams.replace(/([?&])filter=?(&|$)/gi, '$1');
            if (locSearch == '?') locSearch = '';
            else if (locSearch.substr(-1) == "&") locSearch = locSearch.substr(0, locSearch.length - 1);
            if (locSearch.length > 0) {
                var paramKeyFilterRx = new RegExp('([?&])filter=', 'i');
                if (paramKeyFilterRx.test(locSearch))
                    url += locSearch.replace(paramKeyFilterRx, '$1filter=' + paramFeldWert + '_');
                else
                    url += locSearch + '&filter=' + paramFeldWert;
            }
            else {
                url += '?filter=' + paramFeldWert;
            }
        }

        eShop.filter.constructedUrl = url.replace(/(\?|&)seite=\d+(?:&|$)/gi, '$1');

        if (!noRedirect)
            //Liste mit geänderten Filtern laden
            eShop.filter.applyConstructedUrl();
    },

    applyConstructedUrl: function () {
        location.assign(eShop.filter.constructedUrl);
    },

    constructedUrl: null, // Hier wird die Url eingetragen, die durch Anwendung eines Filters konstruiert wurde.

    getConstructedUrl: function (baseUrl) {
        if (eShop.filter.constructedUrl !== null && eShop.filter.constructedUrl !== undefined && eShop.filter.constructedUrl.length > 0)
            return eShop.filter.constructedUrl;

        return baseUrl;
    },

    paramWertEncoding: function (s) {
        return encodeURIComponent(s)
            .replace('(', '%28')
            .replace(')', '%29')
            .replace(/%([a-f0-9]{2})/gi, '($1)')
            .replace('-', '(2D)')
            .replace('_', '(5F)')
            .replace('~', '(7E)');
    },

    reset: function (feld, noRedirect) {
        if (feld == null || feld.length == 0) {
            //Alle Filter deaktivieren
            eShop.filter.constructedUrl = location.href.replace(/[?&]filter=[^&]*$|([?&])filter=[^&]*&?/gi, '$1').replace(/(\?|&)seite=\d+(?:&|$)/gi, '$1');
        }
        else {
            //Filter einer Gruppe deaktivieren
            var url = eShop.filter.constructedUrl == null ? location.href : eShop.filter.constructedUrl;
            var paramIndex = url.indexOf('?');
            var oldSearchPart = url.substr(paramIndex);
            url = url.substring(0, paramIndex);
            var newSearchPart = oldSearchPart.replace(new RegExp('([=_])' + feld + '(?:~|%7e)[^_&]*_|[=_]' + feld + '(?:~|%7e)[^_&]*', 'gi'), '$1');
            newSearchPart = newSearchPart.replace(/[?&]filter$|(\??)filter&/, '$1', 'i').replace(/(\?|&)seite=\d+(?:&|$)/gi, '$1');
            if (oldSearchPart != newSearchPart) {
                eShop.filter.constructedUrl = url + newSearchPart;
            }
        }

        if (!noRedirect)
            eShop.filter.applyConstructedUrl();
    },

    geladenCallback: null

};

// Form- und Postback-Funktionen
eShop.Form = {
    Post: function (url, data) {
        var form = $('<form method="post" />');

        if (url) {
            form.attr('action', url);
        }

        for (var i = 0; i < data.length; i++) {
            $('<input type="hidden">')
                .attr('name', data[i].name)
                .val(data[i].value)
                .appendTo(form);
        }

        //console.log(form.html());
        form
            .appendTo('body')
            .submit();
    },

    Submit: function (formElem, actionName) {
        var elem = $(formElem);
        var form = elem.closest('form');

        var pullInputNames = elem.attr('data-formsubmit-pull');
        if (pullInputNames && pullInputNames.length > 0) {
            eShop.Form.PullInInputs(form, pullInputNames);
        }

        if (actionName && actionName.length > 0) {
            $('<input type="hidden" value="Submitted">')
                .attr('name', actionName)
                .appendTo(form);
        }

        var addInput = elem.attr('data-formsubmit-add');
        if (addInput && addInput.length > 0) {
            var addData = JSON.parse(addInput);
            for (var key in addData) {
                $('<input type="hidden">')
                    .attr('name', key)
                    .val(addData[key])
                    .appendTo(form);
            }
        }

        form.submit();
    },

    SetupSubmitElements: function () {
        let handler = function (e) {
            let $this = $(this);

            e.preventDefault();

            var elemActionName = $this.attr('data-formsubmit');
            eShop.Form.Submit(this, elemActionName);
        };
        $('input[data-formsubmit], button[data-formsubmit], a[data-formsubmit]').click(handler);
        $('select[data-formsubmit], textarea[data-formsubmit]').change(handler);
    },

    PullInInputs: function (form, inputNames) {
        var names = inputNames.split(',');
        for (var i = 0; i < names.length; i++) {
            var elem = $('input[name="' + names[i] + '"], textarea[name="' + names[i] + '"], select[name="' + names[i] + '"]').first();

            if (elem.is('[type=checkbox]') && !elem.is(':checked'))
                continue;

            var val = elem.val();
            if (val && val.length > 0) {
                form.append('<input type="hidden" name="' + names[i] + '" value="' + val + '" />');
            }
        }
    }
};

//jQuery Erweiterungen
$.fn.hasScrollBar = function () {
    var hasScrollBar = {}, e = this.get(0);
    hasScrollBar.vertical = e.scrollHeight > e.clientHeight ? true : false;
    hasScrollBar.horizontal = e.scrollWidth > e.clientWidth ? true : false;
    return hasScrollBar;
};
$.scrollbarWidth = function () {
    var parent, child, width;
    parent = $('<div style="width:50px;height:50px;overflow:auto;position:absolute"><div/></div>').appendTo('body');
    child = parent.children();
    width = child.innerWidth() - child.height(99).innerWidth();
    parent.remove();
    return width;
};
$.zeroPad = function (num, size) {
    var s = num + "";
    while (s.length < size) s = "0" + s;
    return s;
};

$(function () {

    // Forms
    eShop.Form.SetupSubmitElements();

    //In den Warenkorb
    eShop.inDenWarenkorbButtonInit();
    $('#warenkorb-hinweis .overlay, #warenkorb-hinweis a[href="Schliessen"]').click(function (e) {
        e.preventDefault();
        $('#warenkorb-hinweis, #warenkorb-hinweis .folgeartikel').addClass('inaktiv')
            .find('ul.artikelliste').empty();
    });

    //Artikellisten-Filter
    eShop.filter.init();

    //Bilder laden
    eShop.loadImagesInPxRatio();

    //Cookie Hinweis
    eShop.cookies.hinweisCheck();

    //Suche
    $('#suche-eingabe').keydown(function (e) {
        if (e.which == 13) {
            e.preventDefault();
            location.href = $(this).attr('data-url') + '?s=' + encodeURIComponent($(this).val());
        }
    });

    //Lieferadressen-Suche
    $('#suche-lieferadressen .eingabe').each(function () {
        var elem = $(this);

        //Wert speichern
        elem.data('oldVal', elem.val());

        //Änderungen an Wert überprüfen
        elem.bind("propertychange change click keyup input paste", function (event) {
            //Wenn der Wert geändert hat
            if (elem.data('oldVal') != elem.val()) {
                //Aktualisierter Wert
                elem.data('oldVal', elem.val());

                if ($(this).val().length >= 2) {
                    var searchPattern = $(this).val();
                    searchPattern = searchPattern.toLowerCase();
                    $('.lieferadressen .search-item').each(function () {
                        //Regex Match
                        var refString = $(this).text();
                        refString = refString.toLowerCase();
                        if (refString.search(searchPattern) != -1) {
                            //Wenn Ja -> ggf. no-match Klasse entfernen
                            $(this).parent().removeClass('no-match');
                        }
                        else {
                            //Wenn Nein -> no-match Klasse hinzufügen
                            if ($(this).parent().hasClass('no-match') == false) {
                                $(this).parent().addClass('no-match');
                            }
                        }
                    });
                }
                else {
                    //Ergebnisse freigeben / keine Suche
                    $('.lieferadressen .no-match').removeClass('no-match');
                }
            }
        })
            .keydown(function (event) {
                if (event.which == 13) {
                    event.preventDefault();
                }
            });
    });

    // Mietpreis-Berechnung
    $('.mietpreisberechnung input, input[data-rentalprice-calc]')
        .keypress(function (e) {
            if (e.which === 13) e.preventDefault();
        })
        .keyup(function () {
            var $this = $(this);
            var daysCount = $this.val();

            // Wenn eine Zahl eingegeben wurde
            if (/^\d+$/.test(daysCount)) {
                daysCount = daysCount * 1;
                if (daysCount === 0) daysCount = 1;

                if (!$this.data('RentalPrice')) {
                    //Mietpreise abfragen und speichern
                    $.get('/api/s/rentalprice/' + $this.attr('data-id'), function (data) {
                        $this.data('RentalPrice', data);
                        setRentalPrice(daysCount, $this);
                    });
                }
                else {
                    setRentalPrice(daysCount, $this);
                }
            }
        });
    var setRentalPrice = function (daysCount, $elem) {
        var rentalPriceData = $($elem.data('RentalPrice')).find('RentalPrice');

        // Max Tage
        var maxDuration = rentalPriceData.find('MaxDuration').text() * 1;
        if (maxDuration > 0 && daysCount > maxDuration) {
            $elem.val(maxDuration);
            daysCount = maxDuration;
        }

        // Entsprechender Wert im XML suchen
        var rentalType = rentalPriceData.find('RentalType').text() * 1;
        var matchedValue;
        $.each(rentalPriceData.find('Level'), function (i, elem) {
            if ($(elem).children('Days').text() * 1 <= daysCount || i === 0)
                matchedValue = $(elem).children('Value').text();
            else
                return false;
        });
        // Gefundener Wert ausgeben
        if (matchedValue) {
            var newPrice;
            switch (rentalType) {
                case 0:
                    newPrice = matchedValue * daysCount;
                    break;
                case 1:
                    newPrice = rentalPriceData.find('Price').text() * matchedValue * daysCount;
                    break;
                default:
                    newPrice = rentalPriceData.find('Price').text() * matchedValue;
            }
            if (eShop.artikelPreisSetzen) eShop.artikelPreisSetzen(newPrice); // Obsolete
            if (eShop.setProductPrice) eShop.setProductPrice(newPrice);
        }
    };

    if (eShop.GTM !== undefined) {
        eShop.GTM.ECommerce.SetEvents();
    }

});;

// Google Analytics
eShop.GoogleAnalytics = {

	// E-Commerce
    ECommerce: {

        // Daten zu Bestellung
        Purchase: function (data) {

            // Prüfen ob Analytics Basis-Tag vorhanden ist
            if (typeof gtag === "undefined") return;

            // Event an Analytics übermitteln
            gtag('event', 'purchase', data);
            console.log('GAECommerce: Purchase sended.');
        }

    }

};;
eShop.Search = {

    QuickResultsWrap: null, // { Wrap: , ProductsContainer: , CategoriesContainer: }
    TypingBuffer: null,

    ProductResultElementBuilder: null,
    CategoryResultElementBuilder: null,
    NewsResultElementBuilder: null,
    PageResultElementBuilder: null,

    Register: function (inputElem, buttonElem) {
        // Eingabefeld und optionaler Button als Such-Control
        var $input = inputElem ? $(inputElem) : null;

        // Validierung
        if (!$input || $input.length === 0) {
            console.warn('Parameter "inputElem" muss definiert sein. Bitte geben Sie ein INPUT-Element an.');
            return;
        }

        if (!$input.attr('data-searchurl')) {
            console.warn('Das angegebene INPUT-Element muss ein Attribut "data-searchurl" mit der URL der Suchseite haben.');
            return;
        }

        // Events für Suchseite-Suche
        $input.keyup(function (e) {
            if (e.which === 13)
                eShop.Search.CallSearchPage($input.val(), $input.attr('data-searchurl'));
        });

        if (buttonElem) {
            $(buttonElem).click(function (e) {
                e.preventDefault();
                eShop.Search.CallSearchPage($input.val(), $input.attr('data-searchurl'));
            })
        }

        // Quick-Search
        this.BindQuickSearchInput($input);
    },

    RegisterQuickResults: function (outerWrapElem, productContainerElem, categoriesContainerElem, newsContainerElem, pagesContainerElem) {
        // Element für die Aufulistung von Schnellsuch-Resultaten
        if (!outerWrapElem && !productContainerElem && !categoriesContainerElem && !newsContainerElem && !pagesContainerElem) return;
        var wrap = outerWrapElem ? $(outerWrapElem) : $(productContainerElem);

        this.QuickResultsWrap = {
            Wrap: wrap,
            ProductsContainer: productContainerElem ? $(productContainerElem) : wrap,
            CategoriesContainer: categoriesContainerElem ? $(categoriesContainerElem) : null,
            NewsContainer: newsContainerElem ? $(newsContainerElem) : null,
            PagesContainer: pagesContainerElem ? $(pagesContainerElem) : null,
        };
    },

    BindQuickSearchInput: function (inputJElem) {
        // Bindet die Quick-Search an die Eingaben dieses jQuery-Elementes
        if (!inputJElem) return;

        // Event (tippen) behandeln:
        inputJElem.keyup(function (e) {
            if (e.which === 13) return;

            if (eShop.Search.TypingBuffer !== null) 
                clearTimeout(eShop.Search.TypingBuffer);

            eShop.Search.TypingBuffer = setTimeout(function (searchTerm) {
                eShop.Search.ProcessQuickSearch(searchTerm);
            }, 300, inputJElem.val().replace(/^\s+|\+$/g, ''))
            
        });
    },

    ProcessQuickSearch: function (searchTerm) {
        // Behandelt einen Quick-Search Aufruf
        if (this.QuickResultsWrap === null) return;

        if (searchTerm.trim().length < 2) {
            // Zu kurz -> Resultate ausblenden
            this.HideQuickResults();
        }
        else {
            // Resultate anzeigen
            this.ShowQuickResults(searchTerm);
        }
    },

    CallSearchPage: function (searchTerm, searchPageUrl) {
        // Macht eine Serverseitige Suche und ruft die Suchresultate auf.

        // Validierung
        if (!searchTerm || !searchPageUrl || /^\s*$/.test(searchTerm))
            return;

        searchTerm = searchTerm.replace(/^\s+|\+$/g, '');

        // Übermitteln
        location.assign(searchPageUrl + "?s=" + searchTerm);
    },

    HideQuickResults: function () {
        // Suchresultate ausblenden
        this.QuickResultsWrap.Wrap
            .removeClass('active')
            .removeClass('loading')
            .removeClass('ready');
    },

    ShowQuickResults: function (searchTerm) {
        // Suchresultate einblenen/aktualisieren
        this.QuickResultsWrap.Wrap
            .addClass('active')
            .addClass('loading')
            .removeClass('ready')
            .removeClass('empty');

        let requestTypes = [];

        if (eShop.Search.QuickResultsWrap.ProductsContainer) requestTypes.push(1);
        if (eShop.Search.QuickResultsWrap.CategoriesContainer) requestTypes.push(2);
        if (eShop.Search.QuickResultsWrap.NewsContainer) requestTypes.push(3);
        if (eShop.Search.QuickResultsWrap.PagesContainer) requestTypes.push(4);
        $.get('/api/s/quicksearch?s=' + encodeURIComponent(searchTerm) + '&lang=' + this.GetDocumentLanguage() + "&types=" + requestTypes.join(','), function (data) {
            eShop.Search.WipeQuickResults();

            if (eShop.Search.QuickResultsWrap.ProductsContainer && data.Products.length > 0) {
                eShop.Search.FillProductQuickResults(data.Products, searchTerm);
            } else {
                eShop.Search.FillProductQuickResults(null, null);
            }

            if (eShop.Search.QuickResultsWrap.CategoriesContainer && data.Categories.length > 0) {
                eShop.Search.FillCategoriesQuickResults(data.Categories);
            } else {
                eShop.Search.FillCategoriesQuickResults(null);
            }

            if (eShop.Search.QuickResultsWrap.NewsContainer && data.News.length > 0) {
                eShop.Search.FillNewsQuickResults(data.News);
            } else {
                eShop.Search.FillNewsQuickResults(null);
            }

            if (eShop.Search.QuickResultsWrap.PagesContainer && data.Pages.length > 0) {
                eShop.Search.FillPagesQuickResults(data.Pages);
            } else {
                eShop.Search.FillPagesQuickResults(null);
            }

            eShop.Search.QuickResultsWrap.Wrap
                .removeClass('loading')
                .addClass('ready');
            eShop.loadImagesInPxRatio();
        });
    },

    GetDocumentLanguage: function () {
        return $('html').attr('lang');
    },

    WipeQuickResults: function () {
        if (this.QuickResultsWrap.ProductsContainer) {
            var noresulttext = this.QuickResultsWrap.ProductsContainer.attr('data-noresult');
            this.QuickResultsWrap.ProductsContainer.html(noresulttext);
        }

        if (this.QuickResultsWrap.CategoriesContainer) {
            var noresulttext = this.QuickResultsWrap.CategoriesContainer.attr('data-noresult');
            this.QuickResultsWrap.CategoriesContainer.html(noresulttext);
        }

        if (this.QuickResultsWrap.NewsContainer) {
            var noresulttext = this.QuickResultsWrap.NewsContainer.attr('data-noresult');
            this.QuickResultsWrap.NewsContainer.html(noresulttext);
        }
        if (this.QuickResultsWrap.PagesContainer) {
            var noresulttext = this.QuickResultsWrap.PagesContainer.attr('data-noresult');
            this.QuickResultsWrap.PagesContainer.html(noresulttext);
        }
    },

    FillProductQuickResults: function (products, searchTerm) {
        // Listet die Artikel-Schnellsuchresultate auf
        var builder = this.ProductResultElementBuilder ? this.ProductResultElementBuilder : this.DefaultProductResultElementBuilder;

        if (products != null && products.length > 0) {
            this.QuickResultsWrap.ProductsContainer.empty();
            for (var i = 0; i < products.length; i++) {
                this.QuickResultsWrap.ProductsContainer.append(builder(products[i], searchTerm));
            }
        }
    },

    FillCategoriesQuickResults: function (categories) {
        // Listet die Warengruppen-Schnellsuchresultate auf
        var builder = this.CategoryResultElementBuilder ? this.CategoryResultElementBuilder : this.DefaultCategoryResultElementBuilder;

        if (categories != null && categories.length > 0) {
            this.QuickResultsWrap.CategoriesContainer.empty();
            for (var i = 0; i < categories.length; i++) {
                this.QuickResultsWrap.CategoriesContainer.append(builder(categories[i]));
            }
        }
    },

    FillNewsQuickResults: function (news) {
        // Listet die News-Schnellsuchresultate auf
        var builder = this.NewsResultElementBuilder ? this.NewsResultElementBuilder : this.DefaultNewsResultElementBuilder;

        if (news != null && news.length > 0) {
            this.QuickResultsWrap.NewsContainer.empty();
            for (var i = 0; i < news.length; i++) {
                this.QuickResultsWrap.NewsContainer.append(builder(news[i]));
            }
        }
    },

    FillPagesQuickResults: function (pages) {
        // Listet die Inhaltsseiten-Schnellsuchresultate auf
        var builder = this.PageResultElementBuilder ? this.PageResultElementBuilder : this.DefaultPageResultElementBuilder;

        if (pages != null && pages.length > 0) {
            this.QuickResultsWrap.PagesContainer.empty();
            for (var i = 0; i < pages.length; i++) {
                this.QuickResultsWrap.PagesContainer.append(builder(pages[i]));
            }
        }
    },

    DefaultProductResultElementBuilder: function (product, searchTerm) {
        return $('<div class="result product" />')
            .append(
                $('<a />')
                    .attr('href', '/' + product.Url + '?searchstat=' + searchTerm)
                    .attr('title', product.Title)
                    .append(
                        $('<img class="prod-img ' + (product.Image0 ? '' : 'no-image') + '" />')
                            .attr(product.Image0 ? 'data-src' : 'src', product.Image0 ? product.Image0 : '/Content/Custom/img/placeholder16-9.png')
                            .attr('alt', product.Title)
                    )
                    .append(
                        $('<div class="prod-text" />')
                            .append(
                                $('<div class="prod-title" />').html(product.TitleHtml)
                            )
                            .append(
                                $('<div class="prod-nr" />').html(product.ProductNr)
                            )
                    )
            );
    },

    DefaultCategoryResultElementBuilder: function (category) {
        return $('<div class="result category" />')
            .append(
                $('<a />')
                    .attr('href', '/' + category.Url)
                    .attr('title', category.Title)
                    .html(category.TitleHtml)
            );
    },
        
    DefaultNewsResultElementBuilder: function (news) {
        return $('<div class="result news" />')
            .append(
                $('<a />')
                    .attr('href', news.Url)
                    .attr('title', news.Title)
                    .append(
                        $('<img class="news-img ' + (news.TeaserImage ? '' : 'no-image') + '" />')
                            .attr('src', news.TeaserImage ? news.TeaserImage : '/Content/Custom/img/placeholder16-9.png')
                            .attr('alt', news.Title)
                    )
                    .append(
                        $('<div class="news-text" />')
                            .append(
                                $('<div class="news-title" />').html(news.TitleHtml)
                            )
                            .append(
                                $('<div class="news-teaser" />').html(news.TeaserTextHtml)
                            )
                    )
            );
    },

    DefaultPageResultElementBuilder: function (page) {
        return $('<div class="result page" />')
            .append(
                $('<a />')
                    .attr('href', page.Url)
                    .attr('title', page.Title)
                    .append(
                        $('<div class="page-text" />')
                            .append(
                                $('<div class="page-title" />').html(page.TitleHtml)
                            )
                    )
            );
    },
};;
/*
 * Druck-Funktionen
 */

function activatePrintShortcutHandler(showcount) {
    // Mit Ctrl+P auf Druck-Ansicht gelangen
    $(window).keydown(function (event) {
        if (event.ctrlKey && event.keyCode == 80) {
            event.preventDefault();
            openPrintView(showcount);
        }
    });
}

function openPrintView(showcount) {
    var url = window.location.href;
    var showcount = typeof showcount === 'number' && showcount > -1 ? '&showcount=' + showcount : '';

    // Pop-Up mit Druck-Ansicht
    window.open(url + (url.indexOf('?') == -1 ? '?' : '&') + 'view=print' + showcount);
}

function druckUrlParameterHinzufuegen(pagetype) {
    console.warn('Die Methode druckUrlParameterHinzufuegen() ist Veraltet. Bitte stattdessen openPrintView() verwenden!');
    openPrintView(pagetype === "ProductCategory" ? 100 : -1);
};
eShop.orderUploads = {
    fileMaxSize: 0,
    fileAllowedExtensions: [],
    fileTooLargeMessage: 'File too large',
    fileInvalidExtensionMessage: 'Invalid file extension',

    // Setzt die Werte für die Upload-Validierung
    setup: function (maxSize, allowedExtensions, tooLargeMessage, invalidExtensionMessage) {
        this.fileMaxSize = maxSize;
        this.fileAllowedExtensions = allowedExtensions.split(/\s*,\s*/g);
        this.fileTooLargeMessage = tooLargeMessage;
        this.fileInvalidExtensionMessage = invalidExtensionMessage;
    },

    // Registriert Steuerelemente
    registerControls: function (button, fileInput, feedbackHandler, bundleIndex, itemIndex, attributes) {
        // Klick auf Button öffnet den File-Dialog
        button.click(function (e) {
            e.preventDefault();
            fileInput.click();
        });

        // Auswahl einer Datei
        fileInput.change(function () {
            if (!fileInput[0].files || fileInput[0].files.length === 0) return; // Keine Datei gewählt

            var validationResult = eShop.orderUploads.validateFile(fileInput[0].files[0]);
            if (validationResult[0]) {
                console.log('Upload started...');
                eShop.orderUploads.uploadFile(fileInput[0].files[0], feedbackHandler, bundleIndex, itemIndex, attributes);
            }
            else {
                if (feedbackHandler) feedbackHandler(validationResult[0], validationResult[1]);
            }
        });
    },

    // Validiert ein File für den Upload
    validateFile: function (file) {
        // Dateigrösse
        if (file.size > this.fileMaxSize * 1024 * 1024)
            return [false, this.fileTooLargeMessage];

        for (var i = 0; i < this.fileAllowedExtensions.length; i++) {
            if (file.name.endsWith(this.fileAllowedExtensions[i]))
                return [true, ''];
        }

        return [false, this.fileInvalidExtensionMessage];
    },

    // File Upload
    uploadFile: function (file, feedbackHandler, bundleIndex, itemIndex, attributes) {
        var fdata = new FormData();
        fdata.append('file', file);
        if (bundleIndex != undefined) fdata.append('bundleIndex', bundleIndex);
        if (itemIndex != undefined) fdata.append('itemIndex', itemIndex);
        if (attributes != undefined) fdata.append('attributes', JSON.stringify(attributes));
        $.ajax({
            data: fdata,
            url: '/api/s/orderuploads/upload',
            type: 'POST',
            processData: false,
            contentType: false
        })
            .done(function (data) {
                console.log('Upload done');
                if (feedbackHandler) feedbackHandler(data.success, data.message);
            })
            .fail(function () {
                if (feedbackHandler) feedbackHandler(false, 'Fehler beim Upload');
            })
    },

    // Heraufgeladenes File löschen
    deleteFile: function (fileName, feedbackHandler) {
        $.ajax({
            data: { fileName },
            url: '/api/s/orderuploads/delete',
            type: 'POST'
        })
            .done(function (data) {
                if (feedbackHandler) feedbackHandler(data.success, data.message);
            })
            .fail(function () {
                if (feedbackHandler) feedbackHandler(false, 'Fehler beim löschen der Datei');
            })
    }
};
/* Wallee IFrame Methods */

var pageContainer = $('#paymentPage').addClass('loading');

function initWalleeIFrame(paymentMethodConfigurationId) {
	var containerId = 'payment-form';

	var handler = window.IframeCheckoutHandler(paymentMethodConfigurationId);

	handler.setValidationCallback(
		function (validationResult) {
			console.log(validationResult);

			// Reset payment errors
			$('#payment-errors').html('');
			pageContainer.addClass('ready ')

			if (validationResult.success) {
				pageContainer
					.addClass('valid processing')
					.find('.payment-wrapper .actions').find('button, input').prop('disabled', true);

				// Create the order within the shop and eventually update the transaction.
				$.ajax('/api/s/payment/confirmtransaction', {
					success: function () {
						handler.submit();
					}
				});
			}
			else {
				// Display errors to customer
				$.each(validationResult.errors, function (index, errorMessage) {
					$('#payment-errors').append('<li>' + errorMessage + '</li>');
				});
				pageContainer.removeClass('loading')
					.find('.payment-wrapper .actions').find('button, input').prop('disabled', false);
			}
		});

	//Set the optional initialize callback
	handler.setInitializeCallback(function () {
		//Execute initialize code
	});

	//Set the optional height change callback
	handler.setHeightChangeCallback(function (height) {
		//Execute code
		if (height > $('#payment-form').height()) {
			height = '100%';
		}

		var isOffsite = $('#payment-information').length > 0;
		if (!isOffsite && height * 1 === 0) {
			// Wenn im IFrame nichts angezeigt wird aber die Abwicklung on-site ist (z.B. Rechnung PowerPay)
			pageContainer.find('.payment-wrapper .actions').find('button, input').prop('disabled', true);

			handler.validate();
		}
		else {
			pageContainer.removeClass('loading').addClass('ready');
		}
	});

	handler.create(containerId)

	$('#pay-button').on('click', function () {
		handler.validate();
	});
}
;
eShop.cookies = {

    categories: [
        {
            name: 'Necessary',
            value: 1
        },
        {
            name: 'Functional',
            value: 2
        },
        {
            name: 'Analytic',
            value: 4
        },
    ],

    set: function (cname, cvalue, exdays) {
        var d = new Date();
        d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);
        var expires = 'expires=' + d.toUTCString();
        document.cookie = cname + '=' + cvalue + '; ' + expires + '; path=/';
    },

    get: function (cname) {
        var name = cname + '=';
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1);
            if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
        }
        return '';
    },

    hinweisCheck: function () {
        //Hinweis auf Cookies
        var hinwVersion = '2.0';

        if (eShop.cookies.get('CookiesAccepted') != hinwVersion) {
            //Der Hinweis auf Cookies soll angezeigt werden.
            //Standard Hinweis suchen und anzeigen
            var elem = $('#cookies-hinweis');
            if (elem.length > 0) {
                elem.show().addClass('show');
                elem.find('[data-accept]').click(function (e) {
                    e.preventDefault();
                    elem.hide();
                    eShop.cookies.set('CookiesAccepted', hinwVersion, 365);
                });
            }
        }
    },

    // Cookie-Kategorien bestätigen, meist aus Cookie-Banner
    confirmCookies: function (categories) {
        var selectedCategories = 0;
        if (!!categories && categories.indexOf) {
            for (var i = 0; i < eShop.cookies.categories.length; i++) {
                if (categories.indexOf(eShop.cookies.categories[i].value) > -1 || categories.indexOf(eShop.cookies.categories[i].name) > -1)
                    selectedCategories += eShop.cookies.categories[i].value;
            }
        }
        eShop.cookies.set('ConfirmedCookieCategories', selectedCategories + '', 182);
    },

    // Alle Cookie-Kategorien löschen bzw. zurücksetzen
    removeCookieConfirmation: function () {
        eShop.cookies.set('ConfirmedCookieCategories', '', 0);
    },

    getConfirmedCookieCategories: function () {
        var cookieVal = eShop.cookies.get('ConfirmedCookieCategories');
        if (cookieVal === '') return [];
        var cookieNumber = cookieVal * 1;
        if (isNaN(cookieNumber)) return [];

        var categories = [];
        for (var i = eShop.cookies.categories.length -1; i >= 0; i--) {
            if (cookieNumber >= eShop.cookies.categories[i].value) {
                categories.push(eShop.cookies.categories[i]);
                cookieNumber -= eShop.cookies.categories[i].value;
            }
        }
        return categories
    },
    
    getConfirmedCookieCategoryValues: function () {
        var values = [];
        var categories = eShop.cookies.getConfirmedCookieCategories();
        for (var i = 0; i < categories.length; i++) {
            values.push(categories[i].value);
        }
        return values;
    },

    getConfirmedCookieCategoryNames: function () {
        var names = [];
        var categories = eShop.cookies.getConfirmedCookieCategories();
        for (var i = 0; i < categories.length; i++) {
            names.push(categories[i].name);
        }
        return names;
    },

    isCategoryConfirmed(category) {
        if (typeof category === 'string') {
            return eShop.cookies.getConfirmedCookieCategoryNames().indexOf(category) > -1;
        }
        if (typeof category === 'number') {
            return eShop.cookies.getConfirmedCookieCategoryValues().indexOf(category) > -1;
        }
        throw new Error();
    }
};
;
eShop.cookies.initCookieBanner = function () {

    var container = $('.cookie-banner');
    var overlay = $('.cookie-banner-overlay');

    if (container.length === 0)
        // Wird nicht angezeigt, da deaktiviert oder Cookies bereits ausgewählt
        return;

    // Scrollen verhindern
    $('html, body').css('overflow', 'hidden');

    // Handler für Speicherung der Einstellungen
    var confirmCategories = function (categories) {
        // Cookie-Kategorien aktivieren
        eShop.cookies.confirmCookies(categories);

        // Google Consent Mode einstellen
        updateGoogleConsentMode();

        // Cookie-Banner ausblenden
        overlay.hide();

        // Scrollen wieder erlauben
        $('html, body').css('overflow', 'initial');
    };

    // Cookies Einstellen
    container.find('.actions .settings').click(function () {
        container.find('.configure-cookies').slideDown();
    });

    // Handler für Button-Clicks "Notwendige", "Alle"
    container.find('.actions button[data-cookiecategories]').click(function () {
        var cookieCategoriesVal = $(this).attr('data-cookiecategories').split(',');
        var cookieCategories = [];
        for (var i = 0; i < cookieCategoriesVal.length; i++) {
            var num = cookieCategoriesVal[i] * 1;
            if (!isNaN(num)) cookieCategories.push(num);
        }
        confirmCategories(cookieCategories);
    });

    // Handler Benutzrdefinierte Einstellungen Button-Click
    container.find('.configure-cookies .confirm button').click(function () {
        var cookieCategories = [];
        container.find('.configure-cookies .options input[data-cookiecategory]:checked').each(function (i, item) {
            var num = $(item).attr('data-cookiecategory') * 1;
            if (!isNaN(num)) cookieCategories.push(num);
        });
        confirmCategories(cookieCategories);
    });

};

function updateGoogleConsentMode() {
    var isAnalyticCategoryConfirmed = eShop.cookies.isCategoryConfirmed('Analytic');

    if (typeof gtag !== 'undefined') {
        gtag('consent', 'update', {
            'ad_storage': isAnalyticCategoryConfirmed ? 'granted' : 'denied',
            'analytics_storage': isAnalyticCategoryConfirmed ? 'granted' : 'denied'
        });
    }

    if (typeof gtmPush !== 'undefined') {
        gtmPush('consent', 'update', {
            'ad_storage': isAnalyticCategoryConfirmed ? 'granted' : 'denied',
            'analytics_storage': isAnalyticCategoryConfirmed ? 'granted' : 'denied'
        });
    }
};
$(function () {

    //Min-Seitenhöhe
    var minHoeheSetzen = function () {
        var hDiff = $(window).height() - $('#header').outerHeight(true) - $('#inhalt').outerHeight(true) - $('#footer').outerHeight(true) + 1;
        if ($('#slider-haupt').length > 0) hDiff -= $('#slider-haupt').outerHeight(true);
        if (hDiff > 0) $('#inhalt').css('min-height', $('#inhalt').height() + hDiff + 'px');
    };
    $(window).resize(minHoeheSetzen).load(minHoeheSetzen);
    minHoeheSetzen();

    //in-den-Warenkorb plus/minus
    setToCartPlusMinus();;

    $('h1.h4-style').prependTo($('.home_header .component-panel-element'))
    $('h1.h4-style').prependTo($('.about_us .component-textfield'))

    $('.rundgang').prependTo('.home_rundgang');

    $('#shop-partner .component-imagelink').wrapAll('<div class="partner-logos" />');
    $('.tipps-header .component-imagelink').wrapAll('<div class="partner-logos" />');
    $('.tipps-header-detail .partner-logos .component-imagelink').remove();
    $('.news-entry #teaser-image').prependTo('.tipps-header-detail .partner-logos')

    //var highestPanelHeight = 0;
    //$('.home_services .component-multipanel .multipanel-item .component-panel-element').each(function () {
    //    var height = $(this).height();
    //    if (height > highestPanelHeight) {
    //        highestPanelHeight = height;
    //    }
    //});

    //// Set the height of siblings to the highest height
    //$('.home_services .component-multipanel .multipanel-item .component-panel-element').height(highestPanelHeight);

    var highestPanelTextHeight = 0;
    $('.home_services .component-multipanel .multipanel-item .component-panel-element .panel-text').each(function () {
        var height = $(this).height();
        if (height > highestPanelTextHeight) {
            highestPanelTextHeight = height;
        }
    });

    // Set the height of siblings to the highest height
    $('.home_services .component-multipanel .multipanel-item .component-panel-element .panel-text').height(highestPanelTextHeight);

    //var halfWindowWidth = $(window).width() / 2;
    $('.rundgang iframe').css('width', "100%");
    $('#contact iframe').css('width', "100%");

    //Konvig Menu
    $('#konfig-menu').click(function (e) {
        $(this).toggleClass('aktiv');
        $('#konfig').toggleClass('offen');
        $('#suche, #nav-baum-mobile').removeClass('offen');
    });
    $('#konfig').append('<svg height="16" width="32" class="mobile"><polyline points="0,16.5 16,0.5 32,16.5" /></svg>');

    //Sortiment Navigation
    //$('#nav-baum .hat-unterwg a.e1').click(function (e) {
    //    var $this = $(this);
    //    $this.parent().toggleClass('offen').siblings().removeClass('offen');
    //    $('#suche').removeClass('offen');
    //})
    $('#nav-baum li a.e1 span').click(function (e) {
        e.preventDefault();
        var $this = $(this);
        $this.parent().parent().toggleClass('showSub');
        $this.parent().toggleClass('showSub');
    });

    $('#nav-baum li a.pfad.e2').prepend('<svg height="12.5" width="25"><polyline points="0,13 12.5,0.5 25,13" /></svg>')

    $('#mobile-nav').click(function (e) {
        $(this).toggleClass('aktiv');
        $('#nav-baum-mobile').toggleClass('offen');
        $('#nav-baum li.hat-unterwg.e1, #konfig, #suche').removeClass('offen');
        $('#konfig-menu').removeClass('aktiv');
    });
    $('#nav-baum-mobile li.pfad').addClass('offen');
    $('#nav-baum-mobile a.hat-unterwg').click(function (e) {
        var $this = $(this);
        if (!$this.children('.link').not('.ohne-link').children().andSelf().is(e.target)) {
            e.preventDefault();
            $this.parent().toggleClass('offen')
                .find('.offen').removeClass('offen')
                .end()
                .siblings().find('.offen').andSelf().removeClass('offen');
        }
    });

    //Suche
    $('#suche .schalter')
        .click(function (e) {
            $(this).parent().toggleClass('offen')
                .find('.eingabe input').focus();
            $('#nav-baum li.hat-unterwg.e1, #konfig, #nav-baum-mobile').removeClass('offen');
            $('#konfig-menu, #mobile-nav').removeClass('aktiv');
        })
        .siblings('.eingabe').append('<svg height="16" width="32"><polyline points="0,16.5 16,0.5 32,16.5" /></svg>');

    //Dropdowns
    eShop.dropdownMaskieren();

    //Adresse neues Passwort
    $('.passwort-alt a.pw-aendern').click(function (e) {
        e.preventDefault();
        $('#neues-passwort').slideDown(300);
        $(this).remove();
    });
    //Adresse Konto Löschen
    $('#delete-account .do-step').click(function (e) {
        e.preventDefault();
        $('#delete-account').find('.step1').slideUp(300).end()
            .find('.step2').slideDown(300);
    });

    //User Bestellungen
    $('.box-liste.bestellungen li').click(function () {
        $(this).addClass('aktiv').find('.details').slideDown(300).end()
            .siblings('.aktiv').removeClass('aktiv').find('.details').slideUp(300);
    });

    //Warenkorb länge Mitteilung
    $('.weitere-info.mitteilung textarea').keyup(function (e) {
        var v = $(this).val();
        if (v.length >= 2000) $(this).val(v.substr(0, 2000));
    });

    //Merklisten-Schalter
    $('.artikel .merkliste-container.liste .titel').click(function (e) {
        var cont = $(this).closest('.merkliste-container').addClass('offen');
        window.setTimeout(function () { cont.removeClass('offen'); }, 5000);
    });

    //Bilder Lightbox
    $.featherlight.defaults.variant = 'lightbox';

    $('a.lightbox').featherlight({
        openSpeed: 300
    });
    $('a.lightbox-galerie').featherlightGallery({
        previousIcon: '‹',
        nextIcon: '›',
        galleryFadeIn: 300,
        openSpeed: 300
    });

    // Checkout: Payment + Delivery
    $('.selection-group .tile-option').click(function (e) {
        if ($(e.target).is('.info-btn')) {
            $('.info').removeClass('offen');
            $(this).children('.info').toggleClass('offen');
        }

        if (!$(e.target).is('input,label,.info-btn')) {
            $(this).children('input').prop("checked", true).click();
        }
    });

    //WG-Downloads
    $('.wg-details .wg-downloads').each(function () {
        var id = $(this).parent().attr("data-identif");
        eShop.getCategoryDownloads(id);
    });

    $('.wg-details .wg-downloads').click(function () {
        $(this).toggleClass('offen');
    })

    //Customerservices-Schalter
    var customerServicesButtons = $('.customerservices-service .titel')
        .click(function (e) {
            var cont = $(this).closest('.customerservices-service').toggleClass('offen').siblings().removeClass('offen');
        });

    var customerServicesMenuAlign = function () {
        customerServicesButtons.each(function (i, item) {
            var $this = $(this);
            if ($this.closest('.customerservices').is('.customerservices-cart')) {
                if ($this.offset().left + 400 > $(window).outerWidth()) {
                    $this.next("ul").addClass('align-right');
                } else {
                    $this.next("ul").removeClass('align-right');
                }
            }
        })
    };
    $(window).resize(customerServicesMenuAlign);
    customerServicesMenuAlign();

    $('.customerservices-option').click(function (e) {
        if ($(this).hasClass('selected')) {
            $('.customerservices-option').removeClass('selected');
            $(this).closest('.customerservices-service').removeClass('selected');
        } else {
            $(this).siblings('.customerservices-option').removeClass('selected');
            $(this).addClass('selected');
            $(this).closest('.customerservices-service').addClass('selected').removeClass('offen');
        }
    });

    //Passwort zeigen
    $('div.login .eingabe.passwort span.icon-eye-off').click(function () {
        $('div.login .eingabe.passwort span.icon-eye-off').toggleClass("eye-on");
        if ($('#Password').attr('type') === 'password') {
            $('#Password').attr('type', 'text');
        } else {
            $('#Password').attr('type', 'password');
        }
    });

    $('#messageifavailable a').click(function () {
        $('#messageifavailable-content').slideToggle();
    });

    //Zeige nur ein Bild in der Gallery, randomly selected, wenn mobile
    if (navigator.userAgent.match(/Android/i)
        || navigator.userAgent.match(/webOS/i)
        || navigator.userAgent.match(/iPhone/i)
        || navigator.userAgent.match(/iPad/i)
        || navigator.userAgent.match(/iPod/i)
        || navigator.userAgent.match(/BlackBerry/i)
        || navigator.userAgent.match(/Windows Phone/i)) {
        const listItems = document.querySelectorAll('.gallery > .gallery-item');
        const separator = Math.floor(1 + (Math.random() * listItems.length));

        listItems.forEach((item, i) => {
            if ((i + 1) / separator !== 1) {
                item.classList.add('span-' + (i+1));
            }
        });
    }

    $('.masonry .multipanel-item').each(function () {
        $(this).children('.component-panel-element').children('.panel-buttons').children('.component-button').children('.button').each(function () {
            $(this).addClass('icon');
            if ($(this)[0].href.includes("tel")) {
                $(this).addClass('icon-phone');
            } else {
                $(this).addClass('icon-mail');
            }
        });
    });

});

eShop.inDenWarenkorbKontrolle = function (button) {
    //Wird aufgerufen, bevor der Artikel in den Warenkorb übergeben wird.
    //Wird false zurückgegeben, wird der Artikel nicht hinzugefügt.
    return true;
};
//Neue Variante. Alte ist unten.
eShop.CartAddCallback = function (data) {
    if (data.Success)
        $('.dyn-wk-anzahl').text(data.CartProductsCount);
};

eShop.GetCustomerServiceForCartProduct = function (container) {
    if ($('.customerservices-product-detail').length === 0)
        return [];

    var customerServicesSelections = [];
    var customerService = $('.customerservices-service');
    var serviceId = customerService.attr('data-serviceid');
    customerService.each(function (i, serviceItem) {
        var selectedOption = $(serviceItem).find('.customerservices-option.selected');
        if (selectedOption.length > 0) {
            customerServicesSelections.push({
                AppliedTo: selectedOption.attr('data-appliedto'),
                ServiceId: serviceId,
                OptionProductStorageId: selectedOption.attr('data-optionid'),
            });
        }
    });

    return customerServicesSelections;
};

eShop.inDenWarenkorbFeedback = function (data) {

    var $data = $(data);
    var artIdAusfStr = $data.find("IdAusfStr").text();

    if ($('.in-den-warenkorb[data-identif="' + artIdAusfStr + '"]').attr('data-addieren') === '0') {
        eShop.Form.Submit($('.in-den-warenkorb[data-identif="' + artIdAusfStr + '"]'), null);
        return;
    }
    var wkAnzArt = $data.find('WarenkorbAnzahlArtikel').text();
    var fehler = $data.find('Fehler').text();
    var lagerText = $data.find('Lager').text();
    var lagerCss = $data.find('LagerCssKlasse').text();

    if (wkAnzArt) {
        //erfolg
        $('.dyn-wk-anzahl').text(wkAnzArt).removeClass('hidden');
        $('.in-den-warenkorb[data-identif="' + artIdAusfStr + '"] .meldung').removeClass('negativ').addClass('positiv').fadeIn(300).delay(1000).fadeOut(300)
            .children('span').removeClass('icon-x').addClass('icon-check');
    }
    if (fehler) {
        //Fehler
        $('.in-den-warenkorb[data-identif="' + artIdAusfStr + '"] .meldung').removeClass('positiv').addClass('negativ').attr('title', fehler).fadeIn(300)
            .children('span').addClass('icon-x').removeClass('icon-check');
    }
    if (lagerText) {
        //Lager Text aktualisieren
        $('.dyn-bestandtext[data-identif="' + artIdAusfStr + '"]').text(lagerText);
    }
    if (lagerCss) {
        //Lager CSS aktualisieren
        var artElem = $('.artikel[data-identif="' + artIdAusfStr + '"]').removeClass('lager-status-').addClass(lagerCss);
        artElem.attr('class', artElem.attr('class').replace(/\blager-status-[\w\-]*\b/ig, lagerCss));
    }

    if ($('#warenkorb-hinweis').is('.inaktiv')) {
        //Hinweis Pop-Up
        if ($data.find('FolgeArtikelHtml').length > 0) {
            var liste = $('#warenkorb-hinweis .folgeartikel').removeClass('inaktiv')
                .children('ul.artikelliste').html($data.find('FolgeArtikelHtml').text())
                .find('img[data-src]').addClass('force-load').end();
            eShop.inDenWarenkorbButtonInit(liste);
            setToCartPlusMinus();
            eShop.loadImagesInPxRatio();
        }
        $('#warenkorb-hinweis').removeClass('inaktiv');
    }
};

eShop.filter.geladenCallback = function (container) {
    //Wird aufgerufen, sobald die Filter im jQuery-DOM-Objekt 'container' geladen sind.
    if (container === null) return;

    container.find('.kategorie').click(function (e) {
        if (e.target !== $(this).find('.text')[0])
            $(this).find('.text').click();
    }).end()
        .slideDown(450)
        .children('h3').click(function (e) {
            $(this).parent().toggleClass('offen');
        });
};

eShop.artikelPreisSetzen = function (preis) {
    $('.artikel .preis-container .preis').text(preis.toFixed(2));
};

eShop.dropdownMaskieren = function (context) {

    //Maskierung der Dropdowns
    var selectClick = function (e) {
        var $this = $(this);
        var maske = $this.addClass('aktiv').parents('.select-maske')
            .find('.optionen .option.aktiv').not($this).removeClass('aktiv')
            .end().end().find('.platzhalter .text').text($this.text())
            .end().blur();

        var selectElem = maske.find('select');

        var autoUrlParam = selectElem.val($this.attr('data-val')).attr('data-auto-urlparam');
        if (autoUrlParam) {
            var redirUrl = location.href.replace(/#[\w\-]*/i, '').replace(new RegExp('(\\?|&)' + autoUrlParam + '(=[^&]*)?(&)?', 'gi'), '$1').replace(/[?&]$/, '');
            redirUrl += (redirUrl.indexOf('?') > 0 ? '&' : '?') + autoUrlParam + '=' + encodeURIComponent($this.attr('data-val'));
            location.href = redirUrl;
            return;
        }

        let postbackName = selectElem.attr('data-postback-name');
        let postbackUrl = selectElem.attr('data-postback-url');
        if (postbackName) {
            eShop.Form.Post(postbackUrl, [{ name: postbackName, value: $this.attr('data-val') }]);
            return;
        }

        var gewaehlteOption = selectElem.find('option').eq(selectElem.prop('selectedIndex'));
        if (gewaehlteOption && gewaehlteOption.attr('data-auto-url') && gewaehlteOption.attr('data-auto-url').length > 0)
            location.href = gewaehlteOption.attr('data-auto-url');

        selectElem.change();
    };
    $('select.maske', context ? context : document).each(function (i, item) {
        var $item = $(item);

        var maske = $('<div class="select-maske" />');
        maske.addClass($item.attr('class').replace(/(^|\s)maske\s+/i, '$1'));
        if ($item.prop('disabled')) maske.addClass('disabled');
        $item.wrap(maske);

        var $wahl = $('<ul />');
        var optionen = $('<div class="optionen" />').append($wahl);

        $item.parent()
            .attr('tabindex', 10)
            .append('<div class="platzhalter"><span class="icon icon-chevron-down" /><span class="text" /></div>')
            .append(optionen)
            .children('.platzhalter').click(function (e) {
                if (!$(this).closest('.select-maske').is('.disabled'))
                    $(this).parent().toggleClass('offen');
            }).end()
            .blur(function () {
                $(this).removeClass('offen');
            });

        $item.children().each(function (j, opt) {
            var $opt = $(opt);
            var $li = $('<li />').appendTo($wahl);

            if ($opt.is('option')) {
                //Option
                var text = $opt.text().replace(/^\s+|\+$/, '');
                var wert = $opt.attr('value') !== undefined ? $opt.attr('value') : text;
                $li.addClass('option').attr('data-val', wert);
                if (text.length > 0)
                    $li.text(text);
                else
                    $li.html('&nbsp;');

                if ($item.val() == wert) {
                    $li.addClass('aktiv');
                    if (text.length > 0)
                        $item.siblings('.platzhalter').children('.text').text(text);
                    else
                        $item.siblings('.platzhalter').children('.text').html('&nbsp;');
                }
                if ($opt.prop('disabled')) $li.addClass('inaktiv');
                else $li.click(selectClick);
            }
            else if ($opt.is('optgroup')) {
                //Gruppe
                $('<span class="label" />').text($opt.attr('label')).appendTo($li);
                $grpWahl = $('<ul />').appendTo($li.addClass('gruppe'));

                $opt.children('option').each(function (k, grpOpt) {
                    //Option in Gruppe
                    var $grpOpt = $(grpOpt);
                    var text = $grpOpt.text().replace(/^\s+|\+$/, '');
                    var wert = $grpOpt.attr('value') !== undefined ? $grpOpt.attr('value') : text;
                    var $grpLi = $('<li class="option" />').appendTo($grpWahl).attr('data-val', wert);
                    if (text.length > 0)
                        $grpLi.text(text);
                    else
                        $grpLi.html('&nbsp;');

                    if ($item.val() == wert) {
                        $grpLi.addClass('aktiv');
                        if (text.length > 0)
                            $item.siblings('.platzhalter').children('.text').text(text);
                        else
                            $item.siblings('.platzhalter').children('.text').html('&nbsp;');
                    }
                    if ($grpOpt.prop('disabled')) $grpLi.addClass('inaktiv');
                    else $grpLi.click(selectClick);
                });
            }
        });

        if (optionen.hasScrollBar().vertical) {
            optionen.find('.option').css('padding-right', '+=' + $.scrollbarWidth() + 'px');
        }
    });

};

function warenkorbLieferadresseWaehlen() {
    //Warenkorb Lieferadressen
    $('.wk-lieferadresse')
        .find('.lieferadresse-waehlen-liste').slideDown(300)
        .end().find('.aktive-lieferadresse').slideUp(300)
        .end().find('li.lieferadresse.wahl').click(function (e) {
            eShop.Form.Post($(this).closest('[data-posturl]').attr('data-posturl'), [{ name: "id", value: $(this).attr('data-id') }]);
        });
}

function merklisteToggleCallback(erfolg, anzahlArtikel, sender) {
    if (!erfolg) return;

    var $sender = $(sender).toggleClass('aktiv');
    if ($sender.is('.artikel .merkliste-container .merklisten li')) {
        if ($sender.parent().children('li.aktiv').length > 0)
            $sender.closest('.merkliste-container').children('.titel').addClass('aktiv');
        else
            $sender.closest('.merkliste-container').children('.titel').removeClass('aktiv');
    }
}

function merklisteArtikelEntfernen(artId, ausf, elem) {
    var listeId = $(elem).closest('.artikelliste.merkliste').attr('data-liste-id');
    eShop.merklisten.setzen(artId, ausf, listeId, false, elem, function (erfolg, anzahlArtikel, sender) {
        if (!erfolg) return;

        $(sender).closest('.artikelliste .artikel').remove();
        $('.merkliste-anzahl-' + listeId).text(anzahlArtikel);
    });
}

function subscribeMessageIfAvailable(artId, ausf, lang) {
    var mail = $('#messageIfAvailableMailInput').val();
    var name = $('#messageIfAvailableMailInput-name').val();
    if (!name) name = "";
    eShop.messageIfAvailableSubscription(artId, ausf, lang, mail, name, function (data) {
        if (data['errors']) {
            console.log(data['errors'][0].message)
            $('#messageifavailable-error .message').html(data['errors'][0].message)
            $('#messageifavailable-error').toggle();
            return;
        }
        if (data['data']) {
            $('#messageifavailable-content').slideToggle();
            $('#messageifavailable-ok, #messageifavailable a').toggle();
            return;
        }

    })


}

function setToCartPlusMinus() {
    $(".minus, .plus").click(function plusMinus() {
        var t = $(this),
            n, i;
        if (!t.is(".disabled")) {
            n = t.closest("li.artikel div.menge-container, div.artikel-details div.menge-container, div.artikel-pos div.menge-container");
            i = parseFloat(n.attr("data-step"));
            t.is(".minus") && (i = -i);
            var u = n.find(".menge"),
                f = parseFloat(u.val()),
                r = f + i;
            r <= 0 && (r = 1);
            u.val(r);
            n.closest("div.artikel-pos").length > 0 && (t.addClass("disabled"), n.parent().find(".in-den-warenkorb-button").click())
        }
    });
};
